package login_impl

import (
	current_subject "app/app_src/framework/security/current/subject"
	json_util "app/app_src/framework/util/json"
	login_constants "app/app_src/modules/login/constant"

	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
)

// 初始 current_subject
func InitCurrentSubject(ctx *gin.Context) {
	session := sessions.Default(ctx)
	// 从 session 中获取用户信息
	obj := session.Get(login_constants.SESSION_KEY_CURRENT_SUBJECT)

	if obj != nil {
		jsonStr, ok := obj.(string)

		if ok {
			var subject current_subject.Subject
			json_util.FromString(jsonStr, subject)
			// 初始 current_subject
			current_subject.InitCurrentSubject(&subject)
		}
	}
}

// 检查 CSRF 令牌
func CheckCsrfToken(ctx *gin.Context) bool {
	// 从请求头获取 CSRF 令牌
	headerCsrf := ctx.GetHeader(login_constants.CSRF_TOKEN_HEADER_NAME)
	// 从 session 中获取 CSRF 令牌
	session := sessions.Default(ctx)
	obj := session.Get(login_constants.SESSION_KEY_CSRF_TOKEN)

	if obj != nil {
		sessionCsrf, ok := obj.(string)

		if ok && (headerCsrf == sessionCsrf) {
			return true
		}
	}

	return false
}
